package com.wmx.rocketmq.helloWorld;

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;

/**
 * 生产者 - 同步发送消息
 *
 * @author wangMaoXiong
 * @version 1.0
 * @date 2020/11/2 15:52
 */
public class Producer {

    public static void main(String[] args) throws Exception {
        /**
         * 1、声明并初始化一个 producer 生产者，同时指定 Producer Group 生产者组名称
         * 2、一个应用中创建一个 Producer，由应用来维护此对象，可以设置为全局对象或者单例
         * 3、Producer Group 生产者组名称需要由应用来保证唯一性
         * 4、Producer Group 生产者组在发送普通的消息时，作用不大，但是发送分布式事务消息时，比较关键，因为服务器会回查这个 Group 下的任意一个 Producer
         */
        DefaultMQProducer producer = new DefaultMQProducer("rocketMQ-helloWorld-producerGroup");
        /**
         * 1、指定 Producer 连接的 nameServer 服务器所在地址以及端口
         * 2、如果是分布式部署的多个，则用分号隔开，如：setNamesrvAddr("172.16.235.77:9876;172.16.235.78:9876");
         */
        producer.setNamesrvAddr("192.168.116.128:9876");
        /**
         * Producer 对象在使用之前必须要调用 start 进行启动初始化，初始化一次即可，切忌不可每次发送消息时，都调用 start 方法
         */
        producer.start();

        /**
         * 1、一个 Producer 对象可以发送多个 topic（主题），多个 tag（标签） 的消息
         * 2、Message(String topic, String tags, byte[] body)
         */
        for (int i = 0; i < 10; i++) {
            //构造待发送的消息，指定 主题、标签，消息正文，自定义即可
            Message msg = new Message("TopicTest", "TagA", ("Hello RocketMQ！" + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
            //发送消息给 Broker 代理，返回发送结果
            SendResult sendResult = producer.send(msg);
            System.out.printf("发送结果：%s%n", sendResult);
        }
        /**
         * 应用退出时，调用 shutdown 关闭网络连接，清理资源，从 RocketMQ 服务器上注销自己
         * 建议应用在 JBOSS、Tomcat 等容器的退出钩子里调用 shutdown 方法
         */
        producer.shutdown();
        System.out.printf("Producer shutdown.%n");
    }
}